package menu

// MenuMeta 菜单元数据
type MenuMeta struct {
	Title             string   `json:"title"`                       // 菜单名称
	Icon              string   `json:"icon,omitempty"`              // 菜单图标
	ShowBadge         bool     `json:"showBadge,omitempty"`         // 是否显示徽标
	ShowTextBadge     string   `json:"showTextBadge,omitempty"`     // 是否显示新徽标
	IsHide            bool     `json:"isHide,omitempty"`            // 是否在菜单中隐藏
	IsHideTab         bool     `json:"isHideTab,omitempty"`         // 是否在标签页中隐藏
	Link              string   `json:"link,omitempty"`              // 链接
	IsIframe          bool     `json:"isIframe,omitempty"`          // 是否是 iframe
	KeepAlive         bool     `json:"keepAlive"`                   // 是否缓存
	AuthList          []string `json:"authList,omitempty"`          // 可操作权限
	IsInMainContainer bool     `json:"isInMainContainer,omitempty"` // 是否在主容器中
}

// SysMenuVo 菜单模型
type SysMenuVo struct {
	ID        uint         `json:"id" gorm:"primaryKey"`                        // 菜单ID
	Path      string       `json:"path" gorm:"column:path"`                     // 路由
	Name      string       `json:"name" gorm:"column:name"`                     // 组件名
	Component string       `json:"component,omitempty" gorm:"column:component"` // 组件路径
	Meta      MenuMeta     `json:"meta" gorm:"serializer:json"`                 // 菜单元数据
	Children  []*SysMenuVo `json:"children,omitempty" gorm:"-"`                 // 子菜单
	ParentID  uint         `json:"parentId" gorm:"column:parent_id"`            // 父菜单ID
	Sort      uint         `json:"sort" gorm:"column:sort"`                     // 排序
	Status    uint         `json:"status" gorm:"column:status"`                 // 状态：0-禁用，1-启用
	CreatedAt int64        `json:"createdAt" gorm:"column:created_at"`          // 创建时间
	UpdatedAt int64        `json:"updatedAt" gorm:"column:updated_at"`          // 更新时间
}

// TableName 指定表名
func (SysMenuVo) TableName() string {
	return "sys_menus"
}

// TableName 指定表名
func (SysMenu) TableName() string {
	return "sys_menus"
}

// MenuTreeNode 实现TreeNode接口，用于构建树形结构
type MenuTreeNode struct {
	SysMenuVo
}

// GetID 获取节点ID
func (m *MenuTreeNode) GetID() uint {
	return m.ID
}

// GetParentID 获取父节点ID
func (m *MenuTreeNode) GetParentID() uint {
	return m.ParentID
}

// SetChildren 设置子节点
func (m *MenuTreeNode) SetChildren(children []*MenuTreeNode) {
	m.Children = make([]*SysMenuVo, len(children))
	for i, child := range children {
		m.Children[i] = &child.SysMenuVo
	}
}
